package com.tom.learnbase.one;


import com.tom.contants.Contants;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.UserMessage;
import org.junit.jupiter.api.Test;

/**
 * llm具有有限的上下文窗口
 *
 *
 *
 */


/**
 * llm目前有两种API类型:
 *
 * LanguageModel :它们接受 String 作为输入，并返回 String 作为输出 最基础的
 * ChatLanguageModels： 它们接受单个或多个 ChatMessage s作为输入 并返回 AiMessage 作为输出  ChatMessage 通常包含文本，但一些llm也支持文本和 Image s的混合。 这种聊天模型的例子包括OpenAI的 gpt-3.5-turbo 和Google的 gemini-pro
 *
 *
 * 其他类型
 * EmbeddingModel ： 模型可以将文本翻译成 Embedding 。
 * ImageModel ： 该模型可以生成和编辑 Image s。
 * ModerationModel  -该模型可以检查文本是否包含有害内容。
 * ScoringModel  -该模型可以根据查询对多个文本进行评分(或排名)， 本质上确定每个文本与查询的相关性。这对RAG很有用。 这些将在后面介绍。
 *
 *
 */


/**
 * ChatMessage 类型
 * UserMessage :这是来自用户的消息。 用户可以是应用程序的最终用户(人)，也可以是应用程序本身。 根据LLM支持的模式， UserMessage 可以只包含文本( String) )，也可以包含文本和/或图像( Image )。
 * AiMessage :这是由AI生成的消息，通常是对 UserMessage 的响应。 您可能已经注意到，generate方法返回一个包装在 Response 中的 AiMessage 。  AiMessage 可以包含文本响应( String )，也可以包含执行工具的请求( ToolExecutionRequest )
 * ToolExecutionResultMessage :这是 ToolExecutionRequest 操作的结果
 * SystemMessage :这是来自系统的消息。 通常，作为开发人员，您应该定义此消息的内容
 *
 *
 *
 */
public class ChatModelTest {


    /**
     * 学会使用UserMessage 和 多回话
     * 因为llm本质上是无状态的
     */
    @Test
    public void ChatLanguageModelTest(){
        UserMessage firstUserMessage = UserMessage.from("Hello, my name is Klaus");
        AiMessage firstAiMessage = Contants.openAiChatModel.generate(firstUserMessage).content(); // Hi Klaus, how can I help you?
        UserMessage secondUserMessage = UserMessage.from("What is my name?");
        AiMessage secondAiMessage = Contants.openAiChatModel.generate(firstUserMessage, firstAiMessage, secondUserMessage).content(); // Klaus
        Contants.log(secondAiMessage.text());


    }
}
